package cn.demoncat.util.db;

import org.apache.commons.dbutils.BasicRowProcessor;
import org.apache.commons.dbutils.GenerousBeanProcessor;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.*;

import java.util.List;
import java.util.Map;

/**
 * 结果处理器构建工具
 *
 * @author 延晓磊
 * @since 2021年09月23日
 */
public class DbResult {

    /**
     * 单个结果
     *
     * @param <T>   结果类型
     * @return 第1行，第1列
     */
    public static <T>ResultSetHandler<T> one(){
        return new ScalarHandler<>();
    }

    /**
     * 单个结果
     *
     * @param n 列号，从1开始
     * @param <T>   结果类型
     * @return 第1行，第n列
     */
    public static <T>ResultSetHandler<T> one(int n){
        return new ScalarHandler<>(n);
    }

    /**
     * 单个结果
     *
     * @param column 列名
     * @param <T>   结果类型
     * @return 第1行，column列
     */
    public static <T>ResultSetHandler<T> one(String column){
        return new ScalarHandler<>(column);
    }

    /**
     * 单列结果
     *
     * @param <T>   结果类型
     * @return 所有行，第1列
     */
    public static <T>ResultSetHandler<List<T>> list(){
        return new ColumnListHandler<>();
    }

    /**
     * 单列结果
     *
     * @param n 列号，从1开始
     * @param <T>   结果类型
     * @return 所有行，第n列
     */
    public static <T>ResultSetHandler<List<T>> list(int n){
        return new ColumnListHandler<>(n);
    }

    /**
     * 单列结果
     *
     * @param column 列名
     * @param <T>   结果类型
     * @return 所有行，column列
     */
    public static <T>ResultSetHandler<List<T>> list(String column){
        return new ColumnListHandler<>(column);
    }

    /**
     * 单行结果
     *
     * @return 第1行，所有列 {column:value}
     */
    public static ResultSetHandler<Map<String, Object>> map(){
        return new MapHandler();
    }

    /**
     * 多行结果
     *
     * @return 所有行，所有列 [{column:value}]
     */
    public static ResultSetHandler<List<Map<String, Object>>> maps(){
        return new MapListHandler();
    }

    /**
     * 单个对象
     *
     * @param clazz 对象类型
     * @param <T>   结果类型
     *
     * @return 第1行，所有列反射到对象，列名与属性名相同
     */
    public static <T>ResultSetHandler<T> bean(Class<T> clazz){
        return new BeanHandler<>(clazz);
    }

    /**
     * 单个对象
     *
     * @param clazz 对象类型
     * @param <T>   结果类型
     *
     * @return 第1行，所有列反射到对象，支持 x_x 和 xX 类型的列名
     */
    public static <T>ResultSetHandler<T> humpBean(Class<T> clazz){
        return new BeanHandler<>(clazz, new BasicRowProcessor(new GenerousBeanProcessor()));
    }

    /**
     * 对象List
     *
     * @param clazz 对象类型
     * @param <T>   结果类型
     *
     * @return 第1行，所有列反射到对象，列名与属性名相同
     */
    public static <T>ResultSetHandler<List<T>> beans(Class<T> clazz){
        return new BeanListHandler<>(clazz);
    }

    /**
     * 对象List
     *
     * @param clazz 对象类型
     * @param <T>   结果类型
     *
     * @return 第1行，所有列反射到对象，支持 x_x 和 xX 类型的列名
     */
    public static <T>ResultSetHandler<List<T>> humpBeans(Class<T> clazz){
        return new BeanListHandler<>(clazz, new BasicRowProcessor(new GenerousBeanProcessor()));
    }
}
